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