CGCall.h revision c6d07821c529bb95e4cf072e49b736c5142f1786
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
1831777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson#include "llvm/ADT/FoldingSet.h"
1931777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson#include "llvm/Value.h"
200dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "clang/AST/Type.h"
21ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall#include "clang/AST/CanonicalType.h"
220dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
2346f45b9bec4a265ad8400a538e5ec3a5683617f1Daniel Dunbar#include "CGValue.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 {
29761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel  struct AttributeWithIndex;
3088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  class Function;
3188c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar  class Type;
320dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  class Value;
330dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
340dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  template<typename T, unsigned> class SmallVector;
350dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}
360dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
370dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarnamespace clang {
380dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  class ASTContext;
390dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  class Decl;
400dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  class FunctionDecl;
410dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  class ObjCMethodDecl;
427c086516f3cc9fba2733b1919973206c6ba4b171Daniel Dunbar  class VarDecl;
430dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
440dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarnamespace CodeGen {
45761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel  typedef llvm::SmallVector<llvm::AttributeWithIndex, 8> AttributeListType;
460dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
47c6d07821c529bb95e4cf072e49b736c5142f1786Eli Friedman  struct CallArg {
48c6d07821c529bb95e4cf072e49b736c5142f1786Eli Friedman    RValue RV;
49c6d07821c529bb95e4cf072e49b736c5142f1786Eli Friedman    QualType Ty;
50c6d07821c529bb95e4cf072e49b736c5142f1786Eli Friedman    CallArg(RValue rv, QualType ty)
51c6d07821c529bb95e4cf072e49b736c5142f1786Eli Friedman    : RV(rv), Ty(ty)
52c6d07821c529bb95e4cf072e49b736c5142f1786Eli Friedman    { }
53c6d07821c529bb95e4cf072e49b736c5142f1786Eli Friedman  };
54c6d07821c529bb95e4cf072e49b736c5142f1786Eli Friedman
550dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  /// CallArgList - Type for representing both the value and type of
560dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  /// arguments in a call.
57d26bc76c98006609002d9930f8840490e88ac5b5John McCall  class CallArgList :
58c6d07821c529bb95e4cf072e49b736c5142f1786Eli Friedman    public llvm::SmallVector<CallArg, 16> {
59413ebdb1af6fb0d81845b61254daf02ba0449afdJohn McCall  public:
60413ebdb1af6fb0d81845b61254daf02ba0449afdJohn McCall    void add(RValue rvalue, QualType type) {
61c6d07821c529bb95e4cf072e49b736c5142f1786Eli Friedman      push_back(CallArg(rvalue, type));
62413ebdb1af6fb0d81845b61254daf02ba0449afdJohn McCall    }
63d26bc76c98006609002d9930f8840490e88ac5b5John McCall  };
640dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
657c086516f3cc9fba2733b1919973206c6ba4b171Daniel Dunbar  /// FunctionArgList - Type for representing both the decl and type
667c086516f3cc9fba2733b1919973206c6ba4b171Daniel Dunbar  /// of parameters to a function. The decl must be either a
677c086516f3cc9fba2733b1919973206c6ba4b171Daniel Dunbar  /// ParmVarDecl or ImplicitParamDecl.
68d26bc76c98006609002d9930f8840490e88ac5b5John McCall  class FunctionArgList : public llvm::SmallVector<const VarDecl*, 16> {
69d26bc76c98006609002d9930f8840490e88ac5b5John McCall  };
701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
710dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  /// CGFunctionInfo - Class to encapsulate the information about a
720dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  /// function definition.
7340a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar  class CGFunctionInfo : public llvm::FoldingSetNode {
7488c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    struct ArgInfo {
75ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall      CanQualType type;
7688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar      ABIArgInfo info;
7788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    };
7888c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar
79ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar    /// The LLVM::CallingConv to use for this function (as specified by the
80ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar    /// user).
81bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar    unsigned CallingConvention;
82bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar
83ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar    /// The LLVM::CallingConv to actually use for this function, which may
84ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar    /// depend on the ABI.
85ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar    unsigned EffectiveCallingConvention;
86ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar
8704a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    /// Whether this function is noreturn.
8804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    bool NoReturn;
8904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
9088c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    unsigned NumArgs;
9188c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    ArgInfo *Args;
920dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
93425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola    /// How many arguments to pass inreg.
94a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman    bool HasRegParm;
95425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola    unsigned RegParm;
96425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola
970dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  public:
9888c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    typedef const ArgInfo *const_arg_iterator;
9988c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    typedef ArgInfo *arg_iterator;
100a0a99e02f5b2de3817706071077298ef040634feDaniel Dunbar
101bb52114f81e8829fe29a9a0faa49e8b2157206ccChris Lattner    CGFunctionInfo(unsigned CallingConvention, bool NoReturn,
102a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman                   bool HasRegParm, unsigned RegParm, CanQualType ResTy,
103bb52114f81e8829fe29a9a0faa49e8b2157206ccChris Lattner                   const CanQualType *ArgTys, unsigned NumArgTys);
10488c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    ~CGFunctionInfo() { delete[] Args; }
10588c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar
10688c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    const_arg_iterator arg_begin() const { return Args + 1; }
10788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    const_arg_iterator arg_end() const { return Args + 1 + NumArgs; }
10888c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    arg_iterator arg_begin() { return Args + 1; }
10988c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    arg_iterator arg_end() { return Args + 1 + NumArgs; }
1100dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
1114b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar    unsigned  arg_size() const { return NumArgs; }
1124b5f0a4bd6645e87e5feae4be4675ce87d97b4a5Daniel Dunbar
11304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    bool isNoReturn() const { return NoReturn; }
11404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
115ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar    /// getCallingConvention - Return the user specified calling
116ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar    /// convention.
117bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar    unsigned getCallingConvention() const { return CallingConvention; }
118bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar
119ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar    /// getEffectiveCallingConvention - Return the actual calling convention to
120ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar    /// use, which may depend on the ABI.
121ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar    unsigned getEffectiveCallingConvention() const {
122ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar      return EffectiveCallingConvention;
123ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar    }
124ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar    void setEffectiveCallingConvention(unsigned Value) {
125ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar      EffectiveCallingConvention = Value;
126ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar    }
127ca6408c3176783f0b29da4679a08512aa05f0c73Daniel Dunbar
128a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman    bool getHasRegParm() const { return HasRegParm; }
129425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola    unsigned getRegParm() const { return RegParm; }
130425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola
131ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall    CanQualType getReturnType() const { return Args[0].type; }
132bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar
13388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    ABIArgInfo &getReturnInfo() { return Args[0].info; }
13488c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar    const ABIArgInfo &getReturnInfo() const { return Args[0].info; }
13540a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar
13640a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar    void Profile(llvm::FoldingSetNodeID &ID) {
137bac7c250c9b098ee3d637c8ed77da62e860d9244Daniel Dunbar      ID.AddInteger(getCallingConvention());
13804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      ID.AddBoolean(NoReturn);
139a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman      ID.AddBoolean(HasRegParm);
140425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola      ID.AddInteger(RegParm);
14135e67d4387bbe3e7e17ee6b17eaa42eebb0eb9f1Daniel Dunbar      getReturnType().Profile(ID);
14288c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar      for (arg_iterator it = arg_begin(), ie = arg_end(); it != ie; ++it)
14388c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar        it->type.Profile(ID);
14440a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar    }
14540a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar    template<class Iterator>
1461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static void Profile(llvm::FoldingSetNodeID &ID,
147264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                        const FunctionType::ExtInfo &Info,
148ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall                        CanQualType ResTy,
14940a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar                        Iterator begin,
15040a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar                        Iterator end) {
151264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola      ID.AddInteger(Info.getCC());
152264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola      ID.AddBoolean(Info.getNoReturn());
153a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman      ID.AddBoolean(Info.getHasRegParm());
154425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola      ID.AddInteger(Info.getRegParm());
15540a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar      ResTy.Profile(ID);
156ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall      for (; begin != end; ++begin) {
157ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall        CanQualType T = *begin; // force iterator to be over canonical types
158ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall        T.Profile(ID);
159ead608af31b6c9abeae1ca6d0b75094dac4641c0John McCall      }
16040a6be686e5d5bb4198f1affda574e8a4b3a7710Daniel Dunbar    }
1610dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar  };
16231777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson
163d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson  /// ReturnValueSlot - Contains the address where the return value of a
164d2490a91341b57df7a7e54f8a707e7ecde2eeb4eAnders Carlsson  /// function can be stored, and whether the address is volatile or not.
16531777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson  class ReturnValueSlot {
16631777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson    llvm::PointerIntPair<llvm::Value *, 1, bool> Value;
16731777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson
16831777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson  public:
16931777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson    ReturnValueSlot() {}
17031777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson    ReturnValueSlot(llvm::Value *Value, bool IsVolatile)
17131777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson      : Value(Value, IsVolatile) {}
17231777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson
17331777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson    bool isNull() const { return !getValue(); }
17431777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson
17531777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson    bool isVolatile() const { return Value.getInt(); }
17631777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson    llvm::Value *getValue() const { return Value.getPointer(); }
17731777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson  };
17831777a2540879051a3c643b90e02c3fd3d315243Anders Carlsson
1790dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}  // end namespace CodeGen
1800dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar}  // end namespace clang
1810dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar
1820dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#endif
183