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/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp
index 8fb3fe3..94378b7 100644
--- a/lib/CodeGen/CGCXX.cpp
+++ b/lib/CodeGen/CGCXX.cpp
@@ -318,6 +318,9 @@
   return ::BuildVirtualCall(*this, VTableIndex, This, Ty);
 }
 
+/// Implementation for CGCXXABI.  Possibly this should be moved into
+/// the incomplete ABI implementations?
+
 CGCXXABI::~CGCXXABI() {}
 
 static void ErrorUnsupportedABI(CodeGenFunction &CGF,
@@ -335,6 +338,11 @@
   return llvm::Constant::getNullValue(CGM.getTypes().ConvertType(T));
 }
 
+const llvm::Type *
+CGCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
+  return CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());
+}
+
 llvm::Value *CGCXXABI::EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
                                                        llvm::Value *&This,
                                                        llvm::Value *MemPtr,
@@ -351,48 +359,53 @@
   return llvm::Constant::getNullValue(FTy->getPointerTo());
 }
 
-llvm::Value *CGCXXABI::EmitMemberFunctionPointerConversion(CodeGenFunction &CGF,
-                                                           const CastExpr *E,
-                                                           llvm::Value *Src) {
+llvm::Value *CGCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
+                                                   const CastExpr *E,
+                                                   llvm::Value *Src) {
   ErrorUnsupportedABI(CGF, "member function pointer conversions");
   return GetBogusMemberPointer(CGM, E->getType());
 }
 
 llvm::Value *
-CGCXXABI::EmitMemberFunctionPointerComparison(CodeGenFunction &CGF,
-                                              llvm::Value *L,
-                                              llvm::Value *R,
-                                              const MemberPointerType *MPT,
-                                              bool Inequality) {
+CGCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
+                                      llvm::Value *L,
+                                      llvm::Value *R,
+                                      const MemberPointerType *MPT,
+                                      bool Inequality) {
   ErrorUnsupportedABI(CGF, "member function pointer comparison");
   return CGF.Builder.getFalse();
 }
 
 llvm::Value *
-CGCXXABI::EmitMemberFunctionPointerIsNotNull(CodeGenFunction &CGF,
-                                             llvm::Value *MemPtr,
-                                             const MemberPointerType *MPT) {
+CGCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
+                                     llvm::Value *MemPtr,
+                                     const MemberPointerType *MPT) {
   ErrorUnsupportedABI(CGF, "member function pointer null testing");
   return CGF.Builder.getFalse();
 }
 
 llvm::Constant *
-CGCXXABI::EmitMemberFunctionPointerConversion(llvm::Constant *C,
-                                              const CastExpr *E) {
+CGCXXABI::EmitMemberPointerConversion(llvm::Constant *C, const CastExpr *E) {
   return GetBogusMemberPointer(CGM, E->getType());
 }
 
 llvm::Constant *
-CGCXXABI::EmitNullMemberFunctionPointer(const MemberPointerType *MPT) {
+CGCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
   return GetBogusMemberPointer(CGM, QualType(MPT, 0));
 }
 
-llvm::Constant *CGCXXABI::EmitMemberFunctionPointer(const CXXMethodDecl *MD) {
+llvm::Constant *CGCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) {
   return GetBogusMemberPointer(CGM,
                          CGM.getContext().getMemberPointerType(MD->getType(),
                                          MD->getParent()->getTypeForDecl()));
 }
 
+llvm::Constant *CGCXXABI::EmitMemberPointer(const FieldDecl *FD) {
+  return GetBogusMemberPointer(CGM,
+                         CGM.getContext().getMemberPointerType(FD->getType(),
+                                         FD->getParent()->getTypeForDecl()));
+}
+
 bool CGCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
   // Fake answer.
   return true;