]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/CodeGen/CGCall.h
Merge llvm, clang, lld and lldb trunk r291012, and resolve conflicts.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / lib / CodeGen / CGCall.h
1 //===----- CGCall.h - Encapsulate calling convention details ----*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // These classes wrap the information about a call or function
11 // definition used to handle ABI compliancy.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_CLANG_LIB_CODEGEN_CGCALL_H
16 #define LLVM_CLANG_LIB_CODEGEN_CGCALL_H
17
18 #include "CGValue.h"
19 #include "EHScopeStack.h"
20 #include "clang/AST/CanonicalType.h"
21 #include "clang/AST/Type.h"
22 #include "llvm/IR/Value.h"
23
24 // FIXME: Restructure so we don't have to expose so much stuff.
25 #include "ABIInfo.h"
26
27 namespace llvm {
28   class AttributeSet;
29   class Function;
30   class Type;
31   class Value;
32 }
33
34 namespace clang {
35   class ASTContext;
36   class Decl;
37   class FunctionDecl;
38   class ObjCMethodDecl;
39   class VarDecl;
40
41 namespace CodeGen {
42   typedef SmallVector<llvm::AttributeSet, 8> AttributeListType;
43
44   /// Abstract information about a function or function prototype.
45   class CGCalleeInfo {
46     /// \brief The function prototype of the callee.
47     const FunctionProtoType *CalleeProtoTy;
48     /// \brief The function declaration of the callee.
49     const Decl *CalleeDecl;
50
51   public:
52     explicit CGCalleeInfo() : CalleeProtoTy(nullptr), CalleeDecl(nullptr) {}
53     CGCalleeInfo(const FunctionProtoType *calleeProtoTy, const Decl *calleeDecl)
54         : CalleeProtoTy(calleeProtoTy), CalleeDecl(calleeDecl) {}
55     CGCalleeInfo(const FunctionProtoType *calleeProtoTy)
56         : CalleeProtoTy(calleeProtoTy), CalleeDecl(nullptr) {}
57     CGCalleeInfo(const Decl *calleeDecl)
58         : CalleeProtoTy(nullptr), CalleeDecl(calleeDecl) {}
59
60     const FunctionProtoType *getCalleeFunctionProtoType() const {
61       return CalleeProtoTy;
62     }
63     const Decl *getCalleeDecl() const { return CalleeDecl; }
64   };
65
66   /// All available information about a concrete callee.
67   class CGCallee {
68     enum class SpecialKind : uintptr_t {
69       Invalid,
70       Builtin,
71       PseudoDestructor,
72
73       Last = PseudoDestructor
74     };
75
76     struct BuiltinInfoStorage {
77       const FunctionDecl *Decl;
78       unsigned ID;
79     };
80     struct PseudoDestructorInfoStorage {
81       const CXXPseudoDestructorExpr *Expr;
82     };
83
84     SpecialKind KindOrFunctionPointer;
85     union {
86       CGCalleeInfo AbstractInfo;
87       BuiltinInfoStorage BuiltinInfo;
88       PseudoDestructorInfoStorage PseudoDestructorInfo;
89     };
90
91     explicit CGCallee(SpecialKind kind) : KindOrFunctionPointer(kind) {}
92
93     CGCallee(const FunctionDecl *builtinDecl, unsigned builtinID)
94         : KindOrFunctionPointer(SpecialKind::Builtin) {
95       BuiltinInfo.Decl = builtinDecl;
96       BuiltinInfo.ID = builtinID;
97     }
98
99   public:
100     CGCallee() : KindOrFunctionPointer(SpecialKind::Invalid) {}
101
102     /// Construct a callee.  Call this constructor directly when this
103     /// isn't a direct call.
104     CGCallee(const CGCalleeInfo &abstractInfo, llvm::Value *functionPtr)
105         : KindOrFunctionPointer(SpecialKind(uintptr_t(functionPtr))) {
106       AbstractInfo = abstractInfo;
107       assert(functionPtr && "configuring callee without function pointer");
108       assert(functionPtr->getType()->isPointerTy());
109       assert(functionPtr->getType()->getPointerElementType()->isFunctionTy());
110     }
111
112     static CGCallee forBuiltin(unsigned builtinID,
113                                const FunctionDecl *builtinDecl) {
114       CGCallee result(SpecialKind::Builtin);
115       result.BuiltinInfo.Decl = builtinDecl;
116       result.BuiltinInfo.ID = builtinID;
117       return result;
118     }
119
120     static CGCallee forPseudoDestructor(const CXXPseudoDestructorExpr *E) {
121       CGCallee result(SpecialKind::PseudoDestructor);
122       result.PseudoDestructorInfo.Expr = E;
123       return result;
124     }
125
126     static CGCallee forDirect(llvm::Constant *functionPtr,
127                         const CGCalleeInfo &abstractInfo = CGCalleeInfo()) {
128       return CGCallee(abstractInfo, functionPtr);
129     }
130
131     bool isBuiltin() const {
132       return KindOrFunctionPointer == SpecialKind::Builtin;
133     }
134     const FunctionDecl *getBuiltinDecl() const {
135       assert(isBuiltin());
136       return BuiltinInfo.Decl;
137     }
138     unsigned getBuiltinID() const {
139       assert(isBuiltin());
140       return BuiltinInfo.ID;
141     }
142
143     bool isPseudoDestructor() const {
144       return KindOrFunctionPointer == SpecialKind::PseudoDestructor;
145     }
146     const CXXPseudoDestructorExpr *getPseudoDestructorExpr() const {
147       assert(isPseudoDestructor());
148       return PseudoDestructorInfo.Expr;
149     }
150
151     bool isOrdinary() const {
152       return uintptr_t(KindOrFunctionPointer) > uintptr_t(SpecialKind::Last);
153     }
154     const CGCalleeInfo &getAbstractInfo() const {
155       assert(isOrdinary());
156       return AbstractInfo;
157     }
158     llvm::Value *getFunctionPointer() const {
159       assert(isOrdinary());
160       return reinterpret_cast<llvm::Value*>(uintptr_t(KindOrFunctionPointer));
161     }
162     llvm::FunctionType *getFunctionType() const {
163       return cast<llvm::FunctionType>(
164                     getFunctionPointer()->getType()->getPointerElementType());
165     }
166     void setFunctionPointer(llvm::Value *functionPtr) {
167       assert(isOrdinary());
168       KindOrFunctionPointer = SpecialKind(uintptr_t(functionPtr));
169     }
170   };
171
172   struct CallArg {
173     RValue RV;
174     QualType Ty;
175     bool NeedsCopy;
176     CallArg(RValue rv, QualType ty, bool needscopy)
177     : RV(rv), Ty(ty), NeedsCopy(needscopy)
178     { }
179   };
180
181   /// CallArgList - Type for representing both the value and type of
182   /// arguments in a call.
183   class CallArgList :
184     public SmallVector<CallArg, 16> {
185   public:
186     CallArgList() : StackBase(nullptr) {}
187
188     struct Writeback {
189       /// The original argument.  Note that the argument l-value
190       /// is potentially null.
191       LValue Source;
192
193       /// The temporary alloca.
194       Address Temporary;
195
196       /// A value to "use" after the writeback, or null.
197       llvm::Value *ToUse;
198     };
199
200     struct CallArgCleanup {
201       EHScopeStack::stable_iterator Cleanup;
202
203       /// The "is active" insertion point.  This instruction is temporary and
204       /// will be removed after insertion.
205       llvm::Instruction *IsActiveIP;
206     };
207
208     void add(RValue rvalue, QualType type, bool needscopy = false) {
209       push_back(CallArg(rvalue, type, needscopy));
210     }
211
212     /// Add all the arguments from another CallArgList to this one. After doing
213     /// this, the old CallArgList retains its list of arguments, but must not
214     /// be used to emit a call.
215     void addFrom(const CallArgList &other) {
216       insert(end(), other.begin(), other.end());
217       Writebacks.insert(Writebacks.end(),
218                         other.Writebacks.begin(), other.Writebacks.end());
219       CleanupsToDeactivate.insert(CleanupsToDeactivate.end(),
220                                   other.CleanupsToDeactivate.begin(),
221                                   other.CleanupsToDeactivate.end());
222       assert(!(StackBase && other.StackBase) && "can't merge stackbases");
223       if (!StackBase)
224         StackBase = other.StackBase;
225     }
226
227     void addWriteback(LValue srcLV, Address temporary,
228                       llvm::Value *toUse) {
229       Writeback writeback = { srcLV, temporary, toUse };
230       Writebacks.push_back(writeback);
231     }
232
233     bool hasWritebacks() const { return !Writebacks.empty(); }
234
235     typedef llvm::iterator_range<SmallVectorImpl<Writeback>::const_iterator>
236       writeback_const_range;
237
238     writeback_const_range writebacks() const {
239       return writeback_const_range(Writebacks.begin(), Writebacks.end());
240     }
241
242     void addArgCleanupDeactivation(EHScopeStack::stable_iterator Cleanup,
243                                    llvm::Instruction *IsActiveIP) {
244       CallArgCleanup ArgCleanup;
245       ArgCleanup.Cleanup = Cleanup;
246       ArgCleanup.IsActiveIP = IsActiveIP;
247       CleanupsToDeactivate.push_back(ArgCleanup);
248     }
249
250     ArrayRef<CallArgCleanup> getCleanupsToDeactivate() const {
251       return CleanupsToDeactivate;
252     }
253
254     void allocateArgumentMemory(CodeGenFunction &CGF);
255     llvm::Instruction *getStackBase() const { return StackBase; }
256     void freeArgumentMemory(CodeGenFunction &CGF) const;
257
258     /// \brief Returns if we're using an inalloca struct to pass arguments in
259     /// memory.
260     bool isUsingInAlloca() const { return StackBase; }
261
262   private:
263     SmallVector<Writeback, 1> Writebacks;
264
265     /// Deactivate these cleanups immediately before making the call.  This
266     /// is used to cleanup objects that are owned by the callee once the call
267     /// occurs.
268     SmallVector<CallArgCleanup, 1> CleanupsToDeactivate;
269
270     /// The stacksave call.  It dominates all of the argument evaluation.
271     llvm::CallInst *StackBase;
272   };
273
274   /// FunctionArgList - Type for representing both the decl and type
275   /// of parameters to a function. The decl must be either a
276   /// ParmVarDecl or ImplicitParamDecl.
277   class FunctionArgList : public SmallVector<const VarDecl*, 16> {
278   };
279
280   /// ReturnValueSlot - Contains the address where the return value of a 
281   /// function can be stored, and whether the address is volatile or not.
282   class ReturnValueSlot {
283     llvm::PointerIntPair<llvm::Value *, 2, unsigned int> Value;
284     CharUnits Alignment;
285
286     // Return value slot flags
287     enum Flags {
288       IS_VOLATILE = 0x1,
289       IS_UNUSED = 0x2,
290     };
291
292   public:
293     ReturnValueSlot() {}
294     ReturnValueSlot(Address Addr, bool IsVolatile, bool IsUnused = false)
295       : Value(Addr.isValid() ? Addr.getPointer() : nullptr,
296               (IsVolatile ? IS_VOLATILE : 0) | (IsUnused ? IS_UNUSED : 0)),
297         Alignment(Addr.isValid() ? Addr.getAlignment() : CharUnits::Zero()) {}
298
299     bool isNull() const { return !getValue().isValid(); }
300
301     bool isVolatile() const { return Value.getInt() & IS_VOLATILE; }
302     Address getValue() const { return Address(Value.getPointer(), Alignment); }
303     bool isUnused() const { return Value.getInt() & IS_UNUSED; }
304   };
305   
306 }  // end namespace CodeGen
307 }  // end namespace clang
308
309 #endif