From 7a9aac2d9ff5a08c080833aa002b8c3e0f99178c Mon Sep 17 00:00:00 2001 From: John McCall Date: Mon, 23 Aug 2010 01:21:21 +0000 Subject: 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. llvm-svn: 111789 --- clang/lib/CodeGen/CGExprConstant.cpp | 53 ++++-------------------------------- 1 file changed, 6 insertions(+), 47 deletions(-) (limited to 'clang/lib/CodeGen/CGExprConstant.cpp') diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index 48826492dff..0dcee6ef6a3 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -454,22 +454,15 @@ public: return Visit(E->getInitializer()); } - llvm::Constant *EmitMemberFunctionPointer(CXXMethodDecl *MD) { - return CGM.getCXXABI().EmitMemberFunctionPointer(MD); - } - llvm::Constant *VisitUnaryAddrOf(UnaryOperator *E) { if (const MemberPointerType *MPT = E->getType()->getAs()) { - QualType T = MPT->getPointeeType(); DeclRefExpr *DRE = cast(E->getSubExpr()); - NamedDecl *ND = DRE->getDecl(); - if (T->isFunctionProtoType()) - return EmitMemberFunctionPointer(cast(ND)); - - // We have a pointer to data member. - return CGM.EmitPointerToDataMember(cast(ND)); + if (MPT->isMemberFunctionPointer()) + return CGM.getCXXABI().EmitMemberPointer(cast(ND)); + else + return CGM.getCXXABI().EmitMemberPointer(cast(ND)); } return 0; @@ -535,24 +528,16 @@ public: } case CastExpr::CK_NullToMemberPointer: { const MemberPointerType *MPT = E->getType()->getAs(); - if (MPT->getPointeeType()->isFunctionType()) - return CGM.getCXXABI().EmitNullMemberFunctionPointer(MPT); - return CGM.EmitNullConstant(E->getType()); + return CGM.getCXXABI().EmitNullMemberPointer(MPT); } case CastExpr::CK_BaseToDerivedMemberPointer: { - const MemberPointerType *MPT = E->getType()->getAs(); - - // TODO: support data-member conversions here! - if (!MPT->getPointeeType()->isFunctionType()) - return 0; - Expr *SubExpr = E->getSubExpr(); llvm::Constant *C = CGM.EmitConstantExpr(SubExpr, SubExpr->getType(), CGF); if (!C) return 0; - return CGM.getCXXABI().EmitMemberFunctionPointerConversion(C, E); + return CGM.getCXXABI().EmitMemberPointerConversion(C, E); } case CastExpr::CK_BitCast: @@ -1134,29 +1119,3 @@ llvm::Constant *CodeGenModule::EmitNullConstant(QualType T) { return llvm::ConstantInt::get(getTypes().ConvertTypeForMem(T), -1ULL, /*isSigned=*/true); } - -llvm::Constant * -CodeGenModule::EmitPointerToDataMember(const FieldDecl *FD) { - - // Itanium C++ ABI 2.3: - // A pointer to data member is an offset from the base address of the class - // object containing it, represented as a ptrdiff_t - - const CXXRecordDecl *ClassDecl = cast(FD->getParent()); - QualType ClassType = - getContext().getTypeDeclType(const_cast(ClassDecl)); - - const llvm::StructType *ClassLTy = - cast(getTypes().ConvertType(ClassType)); - - const CGRecordLayout &RL = - getTypes().getCGRecordLayout(FD->getParent()); - unsigned FieldNo = RL.getLLVMFieldNo(FD); - uint64_t Offset = - getTargetData().getStructLayout(ClassLTy)->getElementOffset(FieldNo); - - const llvm::Type *PtrDiffTy = - getTypes().ConvertType(getContext().getPointerDiffType()); - - return llvm::ConstantInt::get(PtrDiffTy, Offset); -} -- cgit v1.2.3