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#ifndef CLANG_CODEGEN_CGCALL_H 160dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#define CLANG_CODEGEN_CGCALL_H 170dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 1855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "CGValue.h" 199b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner#include "EHScopeStack.h" 2055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/CanonicalType.h" 2155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/Type.h" 2231777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson#include "llvm/ADT/FoldingSet.h" 233b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Value.h" 2446f45b9bec4a265ad8400a538e5ec3a5683617f1Daniel Dunbar 2588c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar// FIXME: Restructure so we don't have to expose so much stuff. 2688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar#include "ABIInfo.h" 2788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar 280dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarnamespace llvm { 29b263bdf2954953cc7cca5d667eb01319ea0f72ecBill Wendling class AttributeSet; 3088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar class Function; 3188c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar class Type; 320dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar class Value; 330dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 340dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 350dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarnamespace clang { 360dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar class ASTContext; 370dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar class Decl; 380dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar class FunctionDecl; 390dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar class ObjCMethodDecl; 407c086516f3cc9fba2733b1919973206c6ba4b171Daniel Dunbar class VarDecl; 410dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 420dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarnamespace CodeGen { 43b263bdf2954953cc7cca5d667eb01319ea0f72ecBill Wendling typedef SmallVector<llvm::AttributeSet, 8> AttributeListType; 440dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 45c6d07821c529bb95e4cf072e49b736c5142f1786Eli Friedman struct CallArg { 46c6d07821c529bb95e4cf072e49b736c5142f1786Eli Friedman RValue RV; 47c6d07821c529bb95e4cf072e49b736c5142f1786Eli Friedman QualType Ty; 4855d484802f3e27930317739efc5f5956b78aac25Eli Friedman bool NeedsCopy; 4955d484802f3e27930317739efc5f5956b78aac25Eli Friedman CallArg(RValue rv, QualType ty, bool needscopy) 5055d484802f3e27930317739efc5f5956b78aac25Eli Friedman : RV(rv), Ty(ty), NeedsCopy(needscopy) 51c6d07821c529bb95e4cf072e49b736c5142f1786Eli Friedman { } 52c6d07821c529bb95e4cf072e49b736c5142f1786Eli Friedman }; 53c6d07821c529bb95e4cf072e49b736c5142f1786Eli Friedman 540dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar /// CallArgList - Type for representing both the value and type of 550dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar /// arguments in a call. 56d26bc76c98006609002d9930f8840490e88ac5b5John McCall class CallArgList : 57686775deca8b8685eb90801495880e3abdd844c2Chris Lattner public SmallVector<CallArg, 16> { 58413ebdb1af6fb0d81845b61254daf02ba0449afdJohn McCall public: 59f85e193739c953358c865005855253af4f68a497John McCall struct Writeback { 60b6a6079449a5275c283982e19b0c38e165833bb2John McCall /// The original argument. Note that the argument l-value 61b6a6079449a5275c283982e19b0c38e165833bb2John McCall /// is potentially null. 62b6a6079449a5275c283982e19b0c38e165833bb2John McCall LValue Source; 63f85e193739c953358c865005855253af4f68a497John McCall 64f85e193739c953358c865005855253af4f68a497John McCall /// The temporary alloca. 65f85e193739c953358c865005855253af4f68a497John McCall llvm::Value *Temporary; 66b6a6079449a5275c283982e19b0c38e165833bb2John McCall 67b6a6079449a5275c283982e19b0c38e165833bb2John McCall /// A value to "use" after the writeback, or null. 68b6a6079449a5275c283982e19b0c38e165833bb2John McCall llvm::Value *ToUse; 69f85e193739c953358c865005855253af4f68a497John McCall }; 70f85e193739c953358c865005855253af4f68a497John McCall 719b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner struct CallArgCleanup { 729b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner EHScopeStack::stable_iterator Cleanup; 739b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner 749b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner /// The "is active" insertion point. This instruction is temporary and 759b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner /// will be removed after insertion. 769b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner llvm::Instruction *IsActiveIP; 779b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner }; 789b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner 7955d484802f3e27930317739efc5f5956b78aac25Eli Friedman void add(RValue rvalue, QualType type, bool needscopy = false) { 8055d484802f3e27930317739efc5f5956b78aac25Eli Friedman push_back(CallArg(rvalue, type, needscopy)); 81413ebdb1af6fb0d81845b61254daf02ba0449afdJohn McCall } 82f85e193739c953358c865005855253af4f68a497John McCall 83f85e193739c953358c865005855253af4f68a497John McCall void addFrom(const CallArgList &other) { 84f85e193739c953358c865005855253af4f68a497John McCall insert(end(), other.begin(), other.end()); 85f85e193739c953358c865005855253af4f68a497John McCall Writebacks.insert(Writebacks.end(), 86f85e193739c953358c865005855253af4f68a497John McCall other.Writebacks.begin(), other.Writebacks.end()); 87f85e193739c953358c865005855253af4f68a497John McCall } 88f85e193739c953358c865005855253af4f68a497John McCall 89b6a6079449a5275c283982e19b0c38e165833bb2John McCall void addWriteback(LValue srcLV, llvm::Value *temporary, 90b6a6079449a5275c283982e19b0c38e165833bb2John McCall llvm::Value *toUse) { 91f85e193739c953358c865005855253af4f68a497John McCall Writeback writeback; 92b6a6079449a5275c283982e19b0c38e165833bb2John McCall writeback.Source = srcLV; 93f85e193739c953358c865005855253af4f68a497John McCall writeback.Temporary = temporary; 94b6a6079449a5275c283982e19b0c38e165833bb2John McCall writeback.ToUse = toUse; 95f85e193739c953358c865005855253af4f68a497John McCall Writebacks.push_back(writeback); 96f85e193739c953358c865005855253af4f68a497John McCall } 97f85e193739c953358c865005855253af4f68a497John McCall 98f85e193739c953358c865005855253af4f68a497John McCall bool hasWritebacks() const { return !Writebacks.empty(); } 99f85e193739c953358c865005855253af4f68a497John McCall 100686775deca8b8685eb90801495880e3abdd844c2Chris Lattner typedef SmallVectorImpl<Writeback>::const_iterator writeback_iterator; 101f85e193739c953358c865005855253af4f68a497John McCall writeback_iterator writeback_begin() const { return Writebacks.begin(); } 102f85e193739c953358c865005855253af4f68a497John McCall writeback_iterator writeback_end() const { return Writebacks.end(); } 103f85e193739c953358c865005855253af4f68a497John McCall 1049b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner void addArgCleanupDeactivation(EHScopeStack::stable_iterator Cleanup, 1059b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner llvm::Instruction *IsActiveIP) { 1069b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner CallArgCleanup ArgCleanup; 1079b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner ArgCleanup.Cleanup = Cleanup; 1089b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner ArgCleanup.IsActiveIP = IsActiveIP; 1099b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner CleanupsToDeactivate.push_back(ArgCleanup); 1109b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner } 1119b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner 1129b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner ArrayRef<CallArgCleanup> getCleanupsToDeactivate() const { 1139b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner return CleanupsToDeactivate; 1149b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner } 1159b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner 116f85e193739c953358c865005855253af4f68a497John McCall private: 117686775deca8b8685eb90801495880e3abdd844c2Chris Lattner SmallVector<Writeback, 1> Writebacks; 1189b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner 1199b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner /// Deactivate these cleanups immediately before making the call. This 1209b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner /// is used to cleanup objects that are owned by the callee once the call 1219b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner /// occurs. 1229b60195ad4843c9e2e231673a0dbc0d5c8c6eb2bReid Kleckner SmallVector<CallArgCleanup, 1> CleanupsToDeactivate; 123d26bc76c98006609002d9930f8840490e88ac5b5John McCall }; 1240dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 125de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall /// A class for recording the number of arguments that a function 126de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall /// signature requires. 127de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall class RequiredArgs { 128de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall /// The number of required arguments, or ~0 if the signature does 129de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall /// not permit optional arguments. 130de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall unsigned NumRequired; 131de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall public: 132de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall enum All_t { All }; 133de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall 134de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall RequiredArgs(All_t _) : NumRequired(~0U) {} 135de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall explicit RequiredArgs(unsigned n) : NumRequired(n) { 136de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall assert(n != ~0U); 137de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall } 138de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall 139de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall /// Compute the arguments required by the given formal prototype, 140de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall /// given that there may be some additional, non-formal arguments 141de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall /// in play. 142de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall static RequiredArgs forPrototypePlus(const FunctionProtoType *prototype, 143de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall unsigned additional) { 144de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall if (!prototype->isVariadic()) return All; 145de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall return RequiredArgs(prototype->getNumArgs() + additional); 146de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall } 147de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall 148de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall static RequiredArgs forPrototype(const FunctionProtoType *prototype) { 149de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall return forPrototypePlus(prototype, 0); 150de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall } 151de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall 152de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall static RequiredArgs forPrototype(CanQual<FunctionProtoType> prototype) { 153de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall return forPrototype(prototype.getTypePtr()); 154de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall } 155de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall 156de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall static RequiredArgs forPrototypePlus(CanQual<FunctionProtoType> prototype, 157de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall unsigned additional) { 158de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall return forPrototypePlus(prototype.getTypePtr(), additional); 159de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall } 160de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall 161de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall bool allowsOptionalArgs() const { return NumRequired != ~0U; } 162e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCall unsigned getNumRequiredArgs() const { 163de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall assert(allowsOptionalArgs()); 164de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall return NumRequired; 165de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall } 166de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall 167de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall unsigned getOpaqueData() const { return NumRequired; } 168de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall static RequiredArgs getFromOpaqueData(unsigned value) { 169de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall if (value == ~0U) return All; 170de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall return RequiredArgs(value); 171de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall } 172de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall }; 173de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall 1747c086516f3cc9fba2733b1919973206c6ba4b171Daniel Dunbar /// FunctionArgList - Type for representing both the decl and type 1757c086516f3cc9fba2733b1919973206c6ba4b171Daniel Dunbar /// of parameters to a function. The decl must be either a 1767c086516f3cc9fba2733b1919973206c6ba4b171Daniel Dunbar /// ParmVarDecl or ImplicitParamDecl. 177686775deca8b8685eb90801495880e3abdd844c2Chris Lattner class FunctionArgList : public SmallVector<const VarDecl*, 16> { 178d26bc76c98006609002d9930f8840490e88ac5b5John McCall }; 1791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1800dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar /// CGFunctionInfo - Class to encapsulate the information about a 1810dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar /// function definition. 18240a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar class CGFunctionInfo : public llvm::FoldingSetNode { 18388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar struct ArgInfo { 184ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall CanQualType type; 18588c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar ABIArgInfo info; 18688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar }; 18788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar 188ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar /// The LLVM::CallingConv to use for this function (as specified by the 189ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar /// user). 190de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall unsigned CallingConvention : 8; 191bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar 192ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar /// The LLVM::CallingConv to actually use for this function, which may 193ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar /// depend on the ABI. 194de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall unsigned EffectiveCallingConvention : 8; 195de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall 196de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall /// The clang::CallingConv that this was originally created with. 197de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall unsigned ASTCallingConvention : 8; 198ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar 19904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall /// Whether this function is noreturn. 200de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall unsigned NoReturn : 1; 20104a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall 202f85e193739c953358c865005855253af4f68a497John McCall /// Whether this function is returns-retained. 203de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall unsigned ReturnsRetained : 1; 204de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall 205de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall /// How many arguments to pass inreg. 206de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall unsigned HasRegParm : 1; 207de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall unsigned RegParm : 4; 208de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall 209de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall RequiredArgs Required; 210f85e193739c953358c865005855253af4f68a497John McCall 21188c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar unsigned NumArgs; 212de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall ArgInfo *getArgsBuffer() { 213de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall return reinterpret_cast<ArgInfo*>(this+1); 214de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall } 215de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall const ArgInfo *getArgsBuffer() const { 216de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall return reinterpret_cast<const ArgInfo*>(this + 1); 217de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall } 2180dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 219de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall CGFunctionInfo() : Required(RequiredArgs::All) {} 220425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola 2210dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar public: 222de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall static CGFunctionInfo *create(unsigned llvmCC, 223de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall const FunctionType::ExtInfo &extInfo, 224de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall CanQualType resultType, 225de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall ArrayRef<CanQualType> argTypes, 226de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall RequiredArgs required); 227de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall 22888c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar typedef const ArgInfo *const_arg_iterator; 22988c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar typedef ArgInfo *arg_iterator; 230a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbar 231de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall const_arg_iterator arg_begin() const { return getArgsBuffer() + 1; } 232de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall const_arg_iterator arg_end() const { return getArgsBuffer() + 1 + NumArgs; } 233de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall arg_iterator arg_begin() { return getArgsBuffer() + 1; } 234de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall arg_iterator arg_end() { return getArgsBuffer() + 1 + NumArgs; } 2350dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 2364b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar unsigned arg_size() const { return NumArgs; } 2374b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar 238de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall bool isVariadic() const { return Required.allowsOptionalArgs(); } 239de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall RequiredArgs getRequiredArgs() const { return Required; } 240de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall 24104a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall bool isNoReturn() const { return NoReturn; } 24204a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall 243de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall /// In ARC, whether this function retains its return value. This 244f85e193739c953358c865005855253af4f68a497John McCall /// is not always reliable for call sites. 245f85e193739c953358c865005855253af4f68a497John McCall bool isReturnsRetained() const { return ReturnsRetained; } 246f85e193739c953358c865005855253af4f68a497John McCall 247de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall /// getASTCallingConvention() - Return the AST-specified calling 248ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar /// convention. 249de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall CallingConv getASTCallingConvention() const { 250de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall return CallingConv(ASTCallingConvention); 251de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall } 252de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall 253de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall /// getCallingConvention - Return the user specified calling 254de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall /// convention, which has been translated into an LLVM CC. 255bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar unsigned getCallingConvention() const { return CallingConvention; } 256bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar 257ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar /// getEffectiveCallingConvention - Return the actual calling convention to 258ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar /// use, which may depend on the ABI. 259ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar unsigned getEffectiveCallingConvention() const { 260ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar return EffectiveCallingConvention; 261ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar } 262ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar void setEffectiveCallingConvention(unsigned Value) { 263ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar EffectiveCallingConvention = Value; 264ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar } 265ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar 266a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman bool getHasRegParm() const { return HasRegParm; } 267425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola unsigned getRegParm() const { return RegParm; } 268425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola 269de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall FunctionType::ExtInfo getExtInfo() const { 270de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall return FunctionType::ExtInfo(isNoReturn(), 271de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall getHasRegParm(), getRegParm(), 272de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall getASTCallingConvention(), 273de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall isReturnsRetained()); 274de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall } 275de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall 276de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall CanQualType getReturnType() const { return getArgsBuffer()[0].type; } 277bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar 278de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall ABIArgInfo &getReturnInfo() { return getArgsBuffer()[0].info; } 279de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall const ABIArgInfo &getReturnInfo() const { return getArgsBuffer()[0].info; } 28040a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar 28140a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar void Profile(llvm::FoldingSetNodeID &ID) { 282de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall ID.AddInteger(getASTCallingConvention()); 28304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall ID.AddBoolean(NoReturn); 284f85e193739c953358c865005855253af4f68a497John McCall ID.AddBoolean(ReturnsRetained); 285a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman ID.AddBoolean(HasRegParm); 286425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola ID.AddInteger(RegParm); 287de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall ID.AddInteger(Required.getOpaqueData()); 28835e67d4387bbe3e7e17ee6b17eaa42eebb0eb9f1Daniel Dunbar getReturnType().Profile(ID); 28988c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar for (arg_iterator it = arg_begin(), ie = arg_end(); it != ie; ++it) 29088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar it->type.Profile(ID); 29140a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar } 2921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static void Profile(llvm::FoldingSetNodeID &ID, 293de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall const FunctionType::ExtInfo &info, 294de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall RequiredArgs required, 295de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall CanQualType resultType, 296de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall ArrayRef<CanQualType> argTypes) { 297de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall ID.AddInteger(info.getCC()); 298de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall ID.AddBoolean(info.getNoReturn()); 299de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall ID.AddBoolean(info.getProducesResult()); 300de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall ID.AddBoolean(info.getHasRegParm()); 301de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall ID.AddInteger(info.getRegParm()); 302de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall ID.AddInteger(required.getOpaqueData()); 303de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall resultType.Profile(ID); 304de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall for (ArrayRef<CanQualType>::iterator 305de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall i = argTypes.begin(), e = argTypes.end(); i != e; ++i) { 306de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall i->Profile(ID); 307ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall } 30840a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar } 3090dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar }; 31031777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson 311d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson /// ReturnValueSlot - Contains the address where the return value of a 312d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson /// function can be stored, and whether the address is volatile or not. 31331777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson class ReturnValueSlot { 31431777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson llvm::PointerIntPair<llvm::Value *, 1, bool> Value; 31531777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson 31631777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson public: 31731777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson ReturnValueSlot() {} 31831777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson ReturnValueSlot(llvm::Value *Value, bool IsVolatile) 31931777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson : Value(Value, IsVolatile) {} 32031777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson 32131777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson bool isNull() const { return !getValue(); } 32231777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson 32331777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson bool isVolatile() const { return Value.getInt(); } 32431777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson llvm::Value *getValue() const { return Value.getPointer(); } 32531777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson }; 32631777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson 3270dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} // end namespace CodeGen 3280dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} // end namespace clang 3290dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 3300dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#endif 331