diff options
Diffstat (limited to 'lib/CodeGen/CGCXX.cpp')
-rw-r--r-- | lib/CodeGen/CGCXX.cpp | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index 8fb3fe3d4b..94378b79e6 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -318,6 +318,9 @@ CodeGenFunction::BuildVirtualCall(const CXXDestructorDecl *DD, CXXDtorType Type, 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 @@ static llvm::Constant *GetBogusMemberPointer(CodeGenModule &CGM, 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 @@ llvm::Value *CGCXXABI::EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF, 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; |