CGCXXABI.h revision 0bab0cdab751248ca389a5592bcb70eac5d39260
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
18namespace llvm {
19  class Constant;
20  class Type;
21  class Value;
22}
23
24namespace clang {
25  class CastExpr;
26  class CXXMethodDecl;
27  class CXXRecordDecl;
28  class FieldDecl;
29  class MemberPointerType;
30  class QualType;
31
32namespace CodeGen {
33  class CodeGenFunction;
34  class CodeGenModule;
35  class MangleContext;
36
37/// Implements C++ ABI-specific code generation functions.
38class CGCXXABI {
39protected:
40  CodeGenModule &CGM;
41
42  CGCXXABI(CodeGenModule &CGM) : CGM(CGM) {}
43
44public:
45
46  virtual ~CGCXXABI();
47
48  /// Gets the mangle context.
49  virtual MangleContext &getMangleContext() = 0;
50
51  /// Find the LLVM type used to represent the given member pointer
52  /// type.
53  virtual const llvm::Type *
54  ConvertMemberPointerType(const MemberPointerType *MPT);
55
56  /// Load a member function from an object and a member function
57  /// pointer.  Apply the this-adjustment and set 'This' to the
58  /// adjusted value.
59  virtual llvm::Value *
60  EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
61                                  llvm::Value *&This,
62                                  llvm::Value *MemPtr,
63                                  const MemberPointerType *MPT);
64
65  /// Perform a derived-to-base or base-to-derived member pointer
66  /// conversion.
67  virtual llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
68                                                   const CastExpr *E,
69                                                   llvm::Value *Src);
70
71  /// Perform a derived-to-base or base-to-derived member pointer
72  /// conversion on a constant member pointer.
73  virtual llvm::Constant *EmitMemberPointerConversion(llvm::Constant *C,
74                                                      const CastExpr *E);
75
76  /// Return true if the given member pointer can be zero-initialized
77  /// (in the C++ sense) with an LLVM zeroinitializer.
78  virtual bool isZeroInitializable(const MemberPointerType *MPT);
79
80  /// Create a null member pointer of the given type.
81  virtual llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT);
82
83  /// Create a member pointer for the given method.
84  virtual llvm::Constant *EmitMemberPointer(const CXXMethodDecl *MD);
85
86  /// Create a member pointer for the given field.
87  virtual llvm::Constant *EmitMemberPointer(const FieldDecl *FD);
88
89  /// Emit a comparison between two member pointers.  Returns an i1.
90  virtual llvm::Value *
91  EmitMemberPointerComparison(CodeGenFunction &CGF,
92                              llvm::Value *L,
93                              llvm::Value *R,
94                              const MemberPointerType *MPT,
95                              bool Inequality);
96
97  /// Determine if a member pointer is non-null.  Returns an i1.
98  virtual llvm::Value *
99  EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
100                             llvm::Value *MemPtr,
101                             const MemberPointerType *MPT);
102};
103
104/// Creates an instance of a C++ ABI class.
105CGCXXABI *CreateARMCXXABI(CodeGenModule &CGM);
106CGCXXABI *CreateItaniumCXXABI(CodeGenModule &CGM);
107CGCXXABI *CreateMicrosoftCXXABI(CodeGenModule &CGM);
108
109}
110}
111
112#endif
113