Abstract out everything having to do with member pointers into the ABI
class;  they should just be completely opaque throughout IR gen now,
although I haven't really audited that.

Fix a bug apparently inherited from gcc-4.2 where we failed to null-check
member data pointers when performing derived-to-base or base-to-derived
conversions on them.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@111789 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGCXXABI.h b/lib/CodeGen/CGCXXABI.h
index c248f1d..25110eb 100644
--- a/lib/CodeGen/CGCXXABI.h
+++ b/lib/CodeGen/CGCXXABI.h
@@ -17,6 +17,7 @@
 
 namespace llvm {
   class Constant;
+  class Type;
   class Value;
 }
 
@@ -24,6 +25,7 @@
   class CastExpr;
   class CXXMethodDecl;
   class CXXRecordDecl;
+  class FieldDecl;
   class MemberPointerType;
   class QualType;
 
@@ -46,44 +48,57 @@
   /// Gets the mangle context.
   virtual MangleContext &getMangleContext() = 0;
 
+  /// Find the LLVM type used to represent the given member pointer
+  /// type.
+  virtual const llvm::Type *
+  ConvertMemberPointerType(const MemberPointerType *MPT);
+
+  /// Load a member function from an object and a member function
+  /// pointer.  Apply the this-adjustment and set 'This' to the
+  /// adjusted value.
   virtual llvm::Value *
   EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
                                   llvm::Value *&This,
                                   llvm::Value *MemPtr,
                                   const MemberPointerType *MPT);
 
-  virtual llvm::Value *
-  EmitMemberFunctionPointerConversion(CodeGenFunction &CGF,
-                                      const CastExpr *E,
-                                      llvm::Value *Src);
+  /// Perform a derived-to-base or base-to-derived member pointer
+  /// conversion.
+  virtual llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
+                                                   const CastExpr *E,
+                                                   llvm::Value *Src);
 
-  // Manipulations on constant expressions.
+  /// Perform a derived-to-base or base-to-derived member pointer
+  /// conversion on a constant member pointer.
+  virtual llvm::Constant *EmitMemberPointerConversion(llvm::Constant *C,
+                                                      const CastExpr *E);
 
-  /// \brief Returns true if the given member pointer can be
-  /// zero-initialized (in the C++ sense) with an LLVM
-  /// zeroinitialized.
+  /// Return true if the given member pointer can be zero-initialized
+  /// (in the C++ sense) with an LLVM zeroinitializer.
   virtual bool isZeroInitializable(const MemberPointerType *MPT);
 
-  virtual llvm::Constant *
-  EmitMemberFunctionPointerConversion(llvm::Constant *C,
-                                      const CastExpr *E);
+  /// Create a null member pointer of the given type.
+  virtual llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT);
 
-  virtual llvm::Constant *
-  EmitNullMemberFunctionPointer(const MemberPointerType *MPT);
+  /// Create a member pointer for the given method.
+  virtual llvm::Constant *EmitMemberPointer(const CXXMethodDecl *MD);
 
-  virtual llvm::Constant *EmitMemberFunctionPointer(const CXXMethodDecl *MD);
+  /// Create a member pointer for the given field.
+  virtual llvm::Constant *EmitMemberPointer(const FieldDecl *FD);
 
+  /// Emit a comparison between two member pointers.  Returns an i1.
   virtual llvm::Value *
-  EmitMemberFunctionPointerComparison(CodeGenFunction &CGF,
-                                      llvm::Value *L,
-                                      llvm::Value *R,
-                                      const MemberPointerType *MPT,
-                                      bool Inequality);
+  EmitMemberPointerComparison(CodeGenFunction &CGF,
+                              llvm::Value *L,
+                              llvm::Value *R,
+                              const MemberPointerType *MPT,
+                              bool Inequality);
 
+  /// Determine if a member pointer is non-null.  Returns an i1.
   virtual llvm::Value *
-  EmitMemberFunctionPointerIsNotNull(CodeGenFunction &CGF,
-                                     llvm::Value *MemPtr,
-                                     const MemberPointerType *MPT);
+  EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
+                             llvm::Value *MemPtr,
+                             const MemberPointerType *MPT);
 };
 
 /// Creates an instance of a C++ ABI class.