CGCXXABI.h revision 1e7fe751466ea82665fd21e9162fd7cc9c5f412d
1//===----- CGCXXABI.h - Interface to C++ ABIs -------------------*- 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// This provides an abstract class for C++ code generation. Concrete subclasses
11// of this implement code generation for specific C++ ABIs.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef CLANG_CODEGEN_CXXABI_H
16#define CLANG_CODEGEN_CXXABI_H
17
18#include "CodeGenFunction.h"
19
20namespace llvm {
21  class Constant;
22  class Type;
23  class Value;
24
25  template <class T> class SmallVectorImpl;
26}
27
28namespace clang {
29  class CastExpr;
30  class CXXConstructorDecl;
31  class CXXDestructorDecl;
32  class CXXMethodDecl;
33  class CXXRecordDecl;
34  class FieldDecl;
35
36namespace CodeGen {
37  class CodeGenFunction;
38  class CodeGenModule;
39  class MangleContext;
40
41/// Implements C++ ABI-specific code generation functions.
42class CGCXXABI {
43protected:
44  CodeGenModule &CGM;
45
46  CGCXXABI(CodeGenModule &CGM) : CGM(CGM) {}
47
48protected:
49  ImplicitParamDecl *&getThisDecl(CodeGenFunction &CGF) {
50    return CGF.CXXThisDecl;
51  }
52  llvm::Value *&getThisValue(CodeGenFunction &CGF) {
53    return CGF.CXXThisValue;
54  }
55
56  ImplicitParamDecl *&getVTTDecl(CodeGenFunction &CGF) {
57    return CGF.CXXVTTDecl;
58  }
59  llvm::Value *&getVTTValue(CodeGenFunction &CGF) {
60    return CGF.CXXVTTValue;
61  }
62
63  /// Build a parameter variable suitable for 'this'.
64  void BuildThisParam(CodeGenFunction &CGF, FunctionArgList &Params);
65
66  /// Perform prolog initialization of the parameter variable suitable
67  /// for 'this' emitted by BuildThisParam.
68  void EmitThisParam(CodeGenFunction &CGF);
69
70  ASTContext &getContext() const { return CGM.getContext(); }
71
72public:
73
74  virtual ~CGCXXABI();
75
76  /// Gets the mangle context.
77  virtual MangleContext &getMangleContext() = 0;
78
79  /// Find the LLVM type used to represent the given member pointer
80  /// type.
81  virtual const llvm::Type *
82  ConvertMemberPointerType(const MemberPointerType *MPT);
83
84  /// Load a member function from an object and a member function
85  /// pointer.  Apply the this-adjustment and set 'This' to the
86  /// adjusted value.
87  virtual llvm::Value *
88  EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
89                                  llvm::Value *&This,
90                                  llvm::Value *MemPtr,
91                                  const MemberPointerType *MPT);
92
93  /// Calculate an l-value from an object and a data member pointer.
94  virtual llvm::Value *EmitMemberDataPointerAddress(CodeGenFunction &CGF,
95                                                    llvm::Value *Base,
96                                                    llvm::Value *MemPtr,
97                                            const MemberPointerType *MPT);
98
99  /// Perform a derived-to-base or base-to-derived member pointer
100  /// conversion.
101  virtual llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
102                                                   const CastExpr *E,
103                                                   llvm::Value *Src);
104
105  /// Perform a derived-to-base or base-to-derived member pointer
106  /// conversion on a constant member pointer.
107  virtual llvm::Constant *EmitMemberPointerConversion(llvm::Constant *C,
108                                                      const CastExpr *E);
109
110  /// Return true if the given member pointer can be zero-initialized
111  /// (in the C++ sense) with an LLVM zeroinitializer.
112  virtual bool isZeroInitializable(const MemberPointerType *MPT);
113
114  /// Create a null member pointer of the given type.
115  virtual llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT);
116
117  /// Create a member pointer for the given method.
118  virtual llvm::Constant *EmitMemberPointer(const CXXMethodDecl *MD);
119
120  /// Create a member pointer for the given field.
121  virtual llvm::Constant *EmitMemberPointer(const FieldDecl *FD);
122
123  /// Emit a comparison between two member pointers.  Returns an i1.
124  virtual llvm::Value *
125  EmitMemberPointerComparison(CodeGenFunction &CGF,
126                              llvm::Value *L,
127                              llvm::Value *R,
128                              const MemberPointerType *MPT,
129                              bool Inequality);
130
131  /// Determine if a member pointer is non-null.  Returns an i1.
132  virtual llvm::Value *
133  EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
134                             llvm::Value *MemPtr,
135                             const MemberPointerType *MPT);
136
137  /// Build the signature of the given constructor variant by adding
138  /// any required parameters.  For convenience, ResTy has been
139  /// initialized to 'void', and ArgTys has been initialized with the
140  /// type of 'this' (although this may be changed by the ABI) and
141  /// will have the formal parameters added to it afterwards.
142  ///
143  /// If there are ever any ABIs where the implicit parameters are
144  /// intermixed with the formal parameters, we can address those
145  /// then.
146  virtual void BuildConstructorSignature(const CXXConstructorDecl *Ctor,
147                                         CXXCtorType T,
148                                         CanQualType &ResTy,
149                               llvm::SmallVectorImpl<CanQualType> &ArgTys) = 0;
150
151  /// Build the signature of the given destructor variant by adding
152  /// any required parameters.  For convenience, ResTy has been
153  /// initialized to 'void' and ArgTys has been initialized with the
154  /// type of 'this' (although this may be changed by the ABI).
155  virtual void BuildDestructorSignature(const CXXDestructorDecl *Dtor,
156                                        CXXDtorType T,
157                                        CanQualType &ResTy,
158                               llvm::SmallVectorImpl<CanQualType> &ArgTys) = 0;
159
160  /// Build the ABI-specific portion of the parameter list for a
161  /// function.  This generally involves a 'this' parameter and
162  /// possibly some extra data for constructors and destructors.
163  ///
164  /// ABIs may also choose to override the return type, which has been
165  /// initialized with the formal return type of the function.
166  virtual void BuildInstanceFunctionParams(CodeGenFunction &CGF,
167                                           QualType &ResTy,
168                                           FunctionArgList &Params) = 0;
169
170  /// Emit the ABI-specific prolog for the function.
171  virtual void EmitInstanceFunctionProlog(CodeGenFunction &CGF) = 0;
172
173  virtual void EmitReturnFromThunk(CodeGenFunction &CGF,
174                                   RValue RV, QualType ResultType);
175
176  /**************************** Array cookies ******************************/
177
178  /// Returns the extra size required in order to store the array
179  /// cookie for the given type.  May return 0 to indicate that no
180  /// array cookie is required.
181  ///
182  /// Several cases are filtered out before this method is called:
183  ///   - non-array allocations never need a cookie
184  ///   - calls to ::operator new(size_t, void*) never need a cookie
185  ///
186  /// \param ElementType - the allocated type of the expression,
187  ///   i.e. the pointee type of the expression result type
188  virtual CharUnits GetArrayCookieSize(QualType ElementType);
189
190  /// Initialize the array cookie for the given allocation.
191  ///
192  /// \param NewPtr - a char* which is the presumed-non-null
193  ///   return value of the allocation function
194  /// \param NumElements - the computed number of elements,
195  ///   potentially collapsed from the multidimensional array case
196  /// \param ElementType - the base element allocated type,
197  ///   i.e. the allocated type after stripping all array types
198  virtual llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
199                                             llvm::Value *NewPtr,
200                                             llvm::Value *NumElements,
201                                             QualType ElementType);
202
203  /// Reads the array cookie associated with the given pointer,
204  /// if it has one.
205  ///
206  /// \param Ptr - a pointer to the first element in the array
207  /// \param ElementType - the base element type of elements of the array
208  /// \param NumElements - an out parameter which will be initialized
209  ///   with the number of elements allocated, or zero if there is no
210  ///   cookie
211  /// \param AllocPtr - an out parameter which will be initialized
212  ///   with a char* pointing to the address returned by the allocation
213  ///   function
214  /// \param CookieSize - an out parameter which will be initialized
215  ///   with the size of the cookie, or zero if there is no cookie
216  virtual void ReadArrayCookie(CodeGenFunction &CGF, llvm::Value *Ptr,
217                               QualType ElementType, llvm::Value *&NumElements,
218                               llvm::Value *&AllocPtr, CharUnits &CookieSize);
219
220};
221
222/// Creates an instance of a C++ ABI class.
223CGCXXABI *CreateARMCXXABI(CodeGenModule &CGM);
224CGCXXABI *CreateItaniumCXXABI(CodeGenModule &CGM);
225CGCXXABI *CreateMicrosoftCXXABI(CodeGenModule &CGM);
226
227}
228}
229
230#endif
231